﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Configuration;
using System.Threading;
using System.Net.Sockets;
using ProtocoloPropietario;
using System.IO;

namespace Servidor
{
    class Program
    {
        //Recurso compartido por varios procesos
        public static Dictionary<string, Servidor> servidores = new Dictionary<string, Servidor>();
        public static string rutaCarpetaArchivos = (ConfigurationManager.AppSettings["DireccionContenidoArchivos"]);
        public static Servidor myServidor = null;
        public static ConexionServidor conexion = null;

        static void Main(string[] args)
        {
            Inicializar();
            ThreadPool.QueueUserWorkItem(new WaitCallback(conexion.RecibirNotificacionesUDP));
            ThreadPool.QueueUserWorkItem(new WaitCallback(conexion.StartListeningTCP));
            Console.ReadLine();
        }

        private static void Inicializar()
        {
            AnchoDeBanda anchoDeBanda = new AnchoDeBanda(Int32.Parse(ConfigurationManager.AppSettings["maxAnchoBandaTotal"]));
            myServidor = new Servidor(IPAddress.Parse(ConfigurationManager.AppSettings["ipTCPServidorCliente"]),
                                            Int32.Parse(ConfigurationManager.AppSettings["puertoTcpCliente"]),
                                            IPAddress.Parse(ConfigurationManager.AppSettings["ipTCPServidor"]),
                                            Int32.Parse(ConfigurationManager.AppSettings["puertoTcpServidor"]),
                                            Int32.Parse(ConfigurationManager.AppSettings["maxAnchoBandaCliente"]),
                                            anchoDeBanda);

            conexion = new ConexionServidor(myServidor, IPAddress.Parse(ConfigurationManager.AppSettings["ipMultiCastServidor"]), Int32.Parse(ConfigurationManager.AppSettings["puertoUdp"]));

            //if (servidores.Count != 0)
            //{
            //    DirectoryInfo di = new DirectoryInfo(Program.rutaCarpetaArchivos);
            //    string strMsj = "";
            //    foreach (FileInfo f in di.GetFiles())
            //    {
            //        strMsj += f.Name + "\0";
            //    }
            //    IPEndPoint ipEnd = new IPEndPoint(servidores.First().Value.IpServidor, servidores.First().Value.NumPuertoServidor);
            //    TcpClient tcpCliente = new TcpClient(ipEnd);
            //    NetworkStream stream = tcpCliente.GetStream();
            //    MensajeProtocolo msj = new MensajeProtocolo(Protocolo.Header.REQ, Protocolo.Comando.SERVIDOR_NOMBRES, strMsj.Length, strMsj);
            //    byte[] buff = msj.ConvertirAByte();
            //    stream.Write(buff, 0, buff.Length);
            //}
        }
    }
}
